#include<bits/stdc++.h>
using namespace std;
    int T,ans;
    int n,m,l,vmax;
    int de[100005];
    int p=0;
    pair<int,int>c[100005];
void dea(int d,int v,int a){
    if(a==0){
        if(v>vmax)c[++p]=make_pair(d,l);
        return ;
    }
    int x=(int)((vmax*vmax-v*v)/2/a)+d;
    if(a>0){
        if(v>vmax)c[++p]=make_pair(d,l);
        else if(v*v+2*a*(l-d)>vmax*vmax)c[++p]=make_pair(x+1,l);
        return ;
    }
    if(a<0){
        if((vmax*vmax-v*v)%(2*a)==0)x--;
        if(v>vmax)c[++p]=make_pair(d,x);
        return ;
    }
}
int check(int x,int y){
    int Left=1,Right=m,Mid;
    while(Left<=Right){
        Mid=(Left+Right)/2;
        if(de[Mid]>=x&&de[Mid]<=y)return true;
        if(de[Mid]>y)Right=Mid-1;
        else Left=Mid+1;
    }
    return false;
}
bool cmp(pair<int,int>x,pair<int,int>y){
    if(x.first!=y.first)return x.first<y.first;
    else return x.second<y.second;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    
    scanf("%d",&T);
    int d,v,a;
    int pp;
    int nex;
    int ml,mr;
    while(T--){
        p=0;
        scanf("%d%d%d%d",&n,&m,&l,&vmax);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&d,&v,&a);
            dea(d,v,a);
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&de[i]);
        }
        ans=0;
        pp=p;
        for(int i=1;i<=p;i++){
            if(check(c[i].first,c[i].second))ans++;
            else c[i].first=l+1,pp--;
        }
        printf("%d ",ans);
        ans=0;
        sort(c+1,c+p+1,cmp);
        p=pp;
    //    cout<<c[1].first<<c[1].second<<'p'<<c[2].first<<c[2].second<<'p'<<c[3].first<<c[3].second<<' ';
        // for(int i=1;i<=p;i++){
        //     if(i==1){
        //         ml=c[i].first,mr=
        //         continue;
        //     }
        //     if()
        // }
        for(int i=1;i<=p;i=nex){
            ans++;
            mr=c[i].second;
            for(nex=i+1;nex<=p;nex++){
                if(c[nex].first>c[i].second)break;
                mr=min(mr,c[nex].second);
                if(!check(c[nex].first,mr))break;
            }
        }
        printf("%d\n",m-ans);
    }
    return 0;
}